#pragma once
#include <string>
#include <cstring>
#include <stdexcept>
using namespace std;

enum TaskType {
    TASK_LOGIN_SECTION1 = 1,
    TASK_LOGIN_SECTION1_RESP_OK,
    TASK_LOGIN_SECTION1_RESP_ERROR,
    TASK_LOGIN_SECTION2 ,
    TASK_LOGIN_SECTION2_RESP_OK,
    TASK_LOGIN_SECTION2_RESP_ERROR,
    TASK_REGISTER_SECTION1,
    TASK_REGISTER_SECTION1_RESP_OK,
    TASK_REGISTER_SECTION1_RESP_ERROR,
    TASK_REGISTER_SECTION2,
    TASK_REGISTER_SECTION2_RESP_OK,
    TASK_REGISTER_SECTION2_RESP_ERROR,
};


class TLV {
public:
    int type;
    int length;
    char data[1024]; // 缓冲区

    TLV();
    TLV(int t, int l, const string& d);
    ~TLV();

    void setType(int t);//设置type类型
    void setLength(int l);//设置长度
    void setData(const string& d);//设置消息内容

    // 将TLV转化为成string（包括type+length+data）
    string TLVtoString() const;
    
    // 将string转化为TLV对象
    static TLV StringtoTLV(const string& buf);
};
